package echecs.tools;

public final class FENUtils {

    public static final int FILE_COUNT = 8;
    public static final int RANK_COUNT = 8;
    public static final String STANDART_STARTING_FEN =
            "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";

    private FENUtils() {
    }

    private static void parseFENActiveColor(final String pChamp, final Board pEtat) {
        pEtat.setWhiteActive(pChamp.charAt(0) == 'w');
    }

    private static void parseFENCastling(final String pChamp, final Board pEtat) {

        final int l = pChamp.length();

        pEtat.setCastleLong(false, false);
        pEtat.setCastleLong(true, false);
        pEtat.setCastleShort(false, false);
        pEtat.setCastleShort(true, false);

        if ((l == 1) && (pChamp.charAt(0) == '-')) {
            return;
        }

        for (int i = l - 1; i >= 0; i--) {
            switch (pChamp.charAt(i)) {
                case 'k':
                    pEtat.setCastleShort(false, true);
                    break;
                case 'K':
                    pEtat.setCastleShort(true, true);
                    break;
                case 'q':
                    pEtat.setCastleLong(false, true);
                    break;
                case 'Q':
                    pEtat.setCastleLong(true, true);
                    break;
                default:

            }
        }
    }

    private static void parseFENEnPassant(final String pChamp, final Board pEtat) {


        final int l = pChamp.length();


        if ((l != 1) || (pChamp.charAt(0) != '-')) {

            pEtat.setEnPassant(Square.valueOf(pChamp));

        }
    }

    private static void parseFENFullmove(final String pChamp, final Board pEtat) {



        final int num = Integer.parseInt(pChamp);

        pEtat.setFullmoveNumber(num);

    }

    private static void parseFENHalfmove(final String pChamp, final Board pEtat) {



        final int nb = Integer.parseInt(pChamp);

        pEtat.setHalfmoveCount(nb);

    }

    private static void parseFENPlacement(final String pChamp, final Board pEtat) {


        int rang = RANK_COUNT - 1;
        int col = 0;
        for (int i = 0; i < pChamp.length(); i++) {
            final char c = pChamp.charAt(i);
            if (c == '/') {

                rang--;
                col = 0;
            } else if ("12345678".indexOf(c) >= 0) {
                final int rep = c - '0';
                for (int j = 0; j < rep; j++) {

                    pEtat.setPieceAt(null, Square.valueOf(col++, rang));

                }
            } else {
                final Piece p = Piece.valueOf(c);


                pEtat.setPieceAt(p, Square.valueOf(col, rang));

                col++;
            }

        }

    }

    public static Board toBoard(final String pFEN) {

        final String[] fields = pFEN.split(" ");
        final Board res = new Board();

        parseFENPlacement(fields[0], res);
        parseFENActiveColor(fields[1], res);
        parseFENCastling(fields[2], res);
        parseFENEnPassant(fields[3], res);
        parseFENHalfmove(fields[4], res);
        parseFENFullmove(fields[5], res);

        return res;
    }

//    public static String toFEN(final Board pEtat) {
//
//        final StringBuilder res = new StringBuilder(toFENKey(pEtat));
//        res.append(' ');
//        res.append(Integer.toString(pEtat.getHalfmoveCount()));
//        res.append(' ');
//        res.append(Integer.toString(pEtat.getFullmoveNumber()));
//
//        return res.toString();
//    }

//    public static String toFENKey(final Board pEtat) {
//
//        final StringBuilder res = new StringBuilder();
//
//        for (int y = RANK_COUNT - 1; y >= 0; y--) {
//            int vide = 0;
//            for (int x = 0; x < FILE_COUNT; x++) {
//                final Piece p = pEtat.getPieceAt(Square.valueOf(x, y));
//                if (p == null) {
//                    vide++;
//                } else {
//                    if (vide > 0) {
//                        res.append((char) ('0' + vide));
//                        vide = 0;
//                    }
//                    res.append(p.getFENLetter());
//                }
//            }
//            if (vide > 0) {
//                res.append((char) ('0' + vide));
//            }
//            if (y != 0) {
//                res.append('/');
//            }
//        }
//        res.append(' ');
//
//        // Champ du trait
//        if (pEtat.isWhiteActive()) {
//            res.append('w');
//        } else {
//            res.append('b');
//        }
//        res.append(' ');
//
//        // Champ des roques...
//        boolean roque = false;
//        if (pEtat.canCastleShort(true)) {
//            res.append('K');
//            roque = true;
//        }
//        if (pEtat.canCastleLong(true)) {
//            res.append('Q');
//            roque = true;
//        }
//        if (pEtat.canCastleShort(false)) {
//            res.append('k');
//            roque = true;
//        }
//        if (pEtat.canCastleLong(false)) {
//            res.append('q');
//            roque = true;
//        }
//        if (!roque) {
//            res.append('-');
//        }
//        res.append(' ');
//
//        // Champ de la prise ne passant...
//        final Square enPassant = pEtat.getEnPassant();
//        if (enPassant != null) {
//            res.append(enPassant.getFENString());
//        } else {
//            res.append('-');
//        }
//
//        return res.toString();
//    }
}
